﻿using System;

namespace 平台互操作性和不安全的代码
{

    #region 启动类

    /*
     * 由于c# 是受托管的，所以间接的C# 不能直接操作内存
     * 而是通过一个开关 unsafe 来操作 相当于是字节再开辟一个缓冲区
     * 不安全代码操作的对象是值，所以里面的所以对象都应该是值类型；
     */
    class Program
    {
        private static void StackallocDemo()
        {
            //指定代码块为不安全代码，相当于在栈中重新开辟了一块用于当前代码快操作的内存，或指向目标地址的内存
            unsafe
            {
                const int width = 20;
                char* ptr = stackalloc char[width];//在栈上分配数组
                string s = "hello dahaihai";
                
                for (int i = 0; i < width; i++)
                {
                    ptr[width - i - 1] = (i < s.Length) ? s[i] : '.';
                }
                var c = new string(ptr, 0, width);

                Console.WriteLine(new string(ptr, 0, width));
            }
        }

        internal  unsafe struct CharArray
        {
            public fixed char characters[20];
        }

        private static void InlineArrayDemo()
        {
            unsafe
            {
                CharArray ca;
                int widthInBytes = sizeof(CharArray);
                int width = widthInBytes / 2;
                string s = "hello dahaihai";
                for (int i = 0; i < width; i++)
                {
                    ca.characters[width - i - 1] = (i < s.Length) ? s[i] : '.';
                }
                var c = new string(ca.characters, 0, width);
                Console.WriteLine(c);
            }
        }


        static void Main(string[] args)
        {
            try
            {
                throw new ArgumentNullException();
            }
            catch (Exception e)
            {

                Console.WriteLine(e.HelpLink);
            }

            StackallocDemo();
            InlineArrayDemo();
            //unsafe
            //{
            //    var t = 7;
            //    var tt = 14;
            //    int* p = &t;
            //    int* q =&(tt);
            //    System.Diagnostics.Debug.WriteLine(p->ToString());
            //    System.Diagnostics.Debug.WriteLine(p->GetType().Name);
            //    System.Diagnostics.Debug.WriteLine(p->GetType());
            //    System.Diagnostics.Debug.WriteLine((int)p);

            //}
        }



    }


    #endregion

}
